/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.myapp.hibernate.util;

import com.myapp.hibernate.model.Apuesta;
import com.myapp.hibernate.model.Boxeador;
import com.myapp.hibernate.model.Combate;
import java.util.ArrayList;
import java.util.Date;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author aacede
 */
public class CombateUtil {

    private Session sesion;
    private Transaction tx;

    private void iniciaOperacion() throws HibernateException {
        sesion = HibernateUtil.getSessionFactory().openSession();
        tx = sesion.beginTransaction();
    }

    private void manejaExcepcion(HibernateException e) throws HibernateException {
        tx.rollback();
        throw new HibernateException("Ocurrió un error en la capa de acceso a datos. Combate", e);
    }

    public Combate obtenerCombate(int idCombate) throws HibernateException {
        Combate c = new Combate();
        try {
            iniciaOperacion();
            c = (Combate) sesion.get(Combate.class, idCombate);
        } finally {
            sesion.close();
        }

        return c;
    }
    
    public Combate obtenerCombatedeApuesta(Apuesta a) throws HibernateException {
        Combate c = new Combate();
        try {
            iniciaOperacion();
            c = (Combate) sesion.createQuery("from Combate where id_combate = "+a.getIdCombate()).uniqueResult();
        } finally {
            sesion.close();
        }

        return c;
    }

    public ArrayList<Combate> obtenerListaCombates() throws HibernateException {
        ArrayList<Combate> lista = new ArrayList<Combate>();
        try {
            iniciaOperacion();
            lista = (ArrayList<Combate>) sesion.createQuery("from Combate").list();
        } finally {
            sesion.close();
        }
        return lista;
    }
    
    public ArrayList<Combate> obtenerListaCombatesDeBoxeador(Boxeador b) throws HibernateException {
        ArrayList<Combate> lista = new ArrayList<Combate>();
        try {
            iniciaOperacion();
            lista = (ArrayList<Combate>) sesion.createQuery("from Combate where id_boxeador1 = "
                    +b.getIdBoxeador()+" OR id_boxeador2 = "+b.getIdBoxeador()).list();
        } finally {
            sesion.close();
        }
        return lista;
    }

    public ArrayList<Combate> obtenerListaCombatesAnteriores(Date hoy) throws HibernateException {
        ArrayList<Combate> lista = new ArrayList<Combate>();
        try {
            iniciaOperacion();
            lista = (ArrayList<Combate>) sesion.createQuery("from Combate where fecha < '" + hoy + "'").list();
        } finally {
            sesion.close();
        }
        return lista;
    }

    public ArrayList<Combate> obtenerListaCombatesAnteriores(String hoy) throws HibernateException {
        ArrayList<Combate> lista = new ArrayList<Combate>();
        try {
            iniciaOperacion();
            lista = (ArrayList<Combate>) sesion.createQuery("from Combate where fecha < '" + hoy + "'").list();
        } finally {
            sesion.close();
        }
        return lista;
    }
    
    public ArrayList<Combate> obtenerListaCombatesPosteriores(String hoy) throws HibernateException {
        ArrayList<Combate> lista = new ArrayList<Combate>();
        try {
            iniciaOperacion();
            lista = (ArrayList<Combate>) sesion.createQuery("from Combate where fecha > '" + hoy + "'").list();
        } finally {
            sesion.close();
        }
        return lista;
    }

    public void actualizaCombate(Combate CombateAActualizar) {
        try {
            iniciaOperacion();
            sesion.update(CombateAActualizar);
            tx.commit();
        } catch (HibernateException e) {
            manejaExcepcion(e);
            throw e;
        }
    }
    public void guardar(Combate nuevo) {
        try {
            iniciaOperacion();
            sesion.save(nuevo);
            tx.commit();
        } catch (HibernateException e) {
            manejaExcepcion(e);
            throw e;
        } finally {
            sesion.close();
        }
    }
    public void borrar(Combate combate) {
        EntradaUtil entradaUtil = new EntradaUtil();
        ApuestaUtil apuestaUtil = new ApuestaUtil();
        entradaUtil.borrarReferenciasPorCombate(combate.getIdCombate());
        apuestaUtil.borrarReferenciasPorCombate(combate);
        
        try {
            iniciaOperacion();
            sesion.delete(combate);
            tx.commit();
        } catch (HibernateException e) {
            manejaExcepcion(e);
            throw e;
        }
    }
    
}
